import { AxiosInstance, AxiosResponse, AxiosError } from 'axios';
import { ResponseData } from './types';

/**
 * 添加请求拦截器
 * @param instance Axios实例
 */
export const setupRequestInterceptors = (instance: AxiosInstance): void => {
    instance.interceptors.request.use(
        (config) => {
            // 从localStorage获取token并添加到请求头
            const token = localStorage.getItem('token');
            if (token && config.headers) {
                config.headers['Authorization'] = `Bearer ${token}`;
            }

            // 从localStorage获取用户信息，提取uid添加到请求数据中
            if (config.method?.toLowerCase() === 'post' && config.data) {
                const userInfo = localStorage.getItem('userInfo');
                let uid = '';

                if (userInfo) {
                    try {
                        const parsedUserInfo = JSON.parse(userInfo);
                        uid = parsedUserInfo.uid || '';
                    } catch (e) {
                        console.error('解析用户信息失败:', e);
                    }
                }

                // 只有当请求数据中没有uid或uid为空时才添加
                if (uid && (!config.data.uid || config.data.uid === '')) {
                    config.data.uid = uid;
                }
            }

            return config;
        },
        (error) => {
            console.error('请求发送失败:', error);
            return Promise.reject(error);
        }
    );
};

/**
 * 添加响应拦截器
 * @param instance Axios实例
 */
export const setupResponseInterceptors = (instance: AxiosInstance): void => {
    instance.interceptors.response.use(
        (response: AxiosResponse) => {
            const res = response.data as ResponseData<any>;

            // 根据后端约定的状态码判断请求是否成功
            if (res.code !== 200) {
                console.error(`请求失败: ${res.msg || '未知错误'}`);

                // 可以根据不同状态码进行不同处理
                if (res.code === 401) {
                    // Token过期或未登录，可以在这里处理登出逻辑
                    localStorage.removeItem('token');
                    // 可以使用路由进行重定向到登录页
                    window.location.href = '/login';
                }

                return Promise.reject(new Error(res.msg || '未知错误'));
            }

            // 直接返回data字段，而不是整个响应对象
            return res.data;
        },
        (error: AxiosError) => {
            // 提取错误信息
            let message = '';
            if (error.response) {
                // 服务器返回了错误状态码
                const status = error.response.status;
                switch (status) {
                    case 400:
                        message = '请求错误';
                        break;
                    case 401:
                        message = '未授权，请登录';
                        // 可以在这里处理登出和重定向
                        localStorage.removeItem('token');
                        window.location.href = '/login';
                        break;
                    case 403:
                        message = '拒绝访问';
                        break;
                    case 404:
                        message = '请求地址不存在';
                        break;
                    case 500:
                        message = '服务器内部错误';
                        break;
                    default:
                        message = `请求失败: ${status}`;
                }
            } else if (error.request) {
                // 请求发送成功，但没有收到响应
                message = '服务器无响应';
            } else {
                // 请求配置出错
                message = '请求配置错误';
            }

            console.error(`请求错误: ${message}`);
            return Promise.reject(error);
        }
    );
}; 